#ifndef ROBOTOTHER_H
#define ROBOTOTHER_H

#include <QObject>
#include "RobProtocol.h"
#include "RobotBase.h"

namespace robokit {

/**
 * @brief RobotOther - AGV其他功能API类
 * @details 连接到AGV的19210端口，提供顶升控制等其他功能
 */
class RobotOther : public RobotBase
{
    Q_OBJECT

public:
    explicit RobotOther(QObject* parent = nullptr);
    ~RobotOther() override = default;

    /**
     * @brief 初始化TCP连接
     * @param address AGV IP地址
     * @param port 端口号（默认19210）
     * @return 是否连接成功
     */
    bool initTcpConnection(const QHostAddress& address, const quint16 port = 19210);

    /**
     * @brief 设置默认地址
     * @param newDefaultAddress IP地址
     */
    void setDefaultAddress(const QString& newDefaultAddress);

    /**
     * @brief 设置默认TCP端口
     * @param newDefaultTcpPort 端口号
     */
    void setDefaultTcpPort(quint16 newDefaultTcpPort);

    /**
     * @brief 检查连接状态
     * @return 是否连接
     */
    bool checkConnection();

    // ========== 顶升控制 API ==========

    /**
     * @brief 顶升机构上升请求
     * @details 命令码: 6070 (0x17B6)
     *          响应码: 16070 (0x3EC6)
     *          无JSON请求数据
     */
    void robot_other_jack_load_req();

    /**
     * @brief 顶升机构下降请求
     * @details 命令码: 6071 (0x17B7)
     *          响应码: 16071 (0x3EC7)
     *          无JSON请求数据
     */
    void robot_other_jack_unload_req();

    // ========== DO 控制 API ==========

    /**
     * @brief 设置DO状态请求
     * @details 命令码: 6001 (0x1771)
     *          响应码: 16001 (0x3E81)
     * @param id DO的id
     * @param status true为高电平, false为低电平
     */
    void robot_other_setdo_req(int id, bool status);

public slots:
    /**
     * @brief 初始化连接（使用默认地址和端口）
     * @return 是否连接成功
     */
    bool initConnection();

    /**
     * @brief 处理错误信息
     * @param msg 错误消息
     */
    void getError(QString msg);

signals:
    /**
     * @brief 顶升上升完成信号
     * @param ret_code API错误码
     * @param err_msg 错误信息
     * @param create_on 时间戳
     */
    void jackLoadCompleted(int ret_code, const QString& err_msg, const QString& create_on);

    /**
     * @brief 顶升下降完成信号
     * @param ret_code API错误码
     * @param err_msg 错误信息
     * @param create_on 时间戳
     */
    void jackUnloadCompleted(int ret_code, const QString& err_msg, const QString& create_on);

    /**
     * @brief 设置DO完成信号
     * @param ret_code API错误码
     * @param err_msg 错误信息
     * @param create_on 时间戳
     */
    void setDoCompleted(int ret_code, const QString& err_msg, const QString& create_on);

private:
    robokit::RProtocol m_protocol;
    QString m_defaultAddress;
    quint16 m_defaultTcpPort{19210};

    // 协议命令码定义
    static constexpr uint16_t CMD_JACK_LOAD_REQ = 6070;      // 0x17B6 - 顶升上升请求
    static constexpr uint16_t CMD_JACK_LOAD_RES = 16070;     // 0x3EC6 - 顶升上升响应
    static constexpr uint16_t CMD_JACK_UNLOAD_REQ = 6071;    // 0x17B7 - 顶升下降请求
    static constexpr uint16_t CMD_JACK_UNLOAD_RES = 16071;   // 0x3EC7 - 顶升下降响应
    static constexpr uint16_t CMD_SETDO_REQ = 6001;          // 0x1771 - 设置DO请求
    static constexpr uint16_t CMD_SETDO_RES = 16001;         // 0x3E81 - 设置DO响应

    /**
     * @brief 处理顶升上升响应
     * @param revCommand 响应命令码
     * @param receivedata 响应数据
     */
    void robot_other_jack_load_res_receive(uint16_t revCommand, QByteArray& receivedata);

    /**
     * @brief 处理顶升下降响应
     * @param revCommand 响应命令码
     * @param receivedata 响应数据
     */
    void robot_other_jack_unload_res_receive(uint16_t revCommand, QByteArray& receivedata);

    /**
     * @brief 处理设置DO响应
     * @param revCommand 响应命令码
     * @param receivedata 响应数据
     */
    void robot_other_setdo_res_receive(uint16_t revCommand, QByteArray& receivedata);
};

} // namespace robokit

#endif // ROBOTOTHER_H
